package aspectos;

import java.util.HashSet;
import java.util.Set;
import uqbar.aspectj.utils.Utils;
import validadores.ObjetoAValidar;
import validadores.Validador;
import dominio.Validable;
import exception.ValorInvalidoException;

public aspect ValidadorAspect {
	
	Set<ObjetoAValidar> validadores = new HashSet<ObjetoAValidar>();

	public pointcut validarNombre(Object target, Object value) : set(* (@Validable  *..*).*)  && target(target) && args(value);

	void around(Object target, Object value) throws ValorInvalidoException : validarNombre( target,value) {
		String fieldName = thisJoinPoint.getSignature().getName();
		Object oldValue = Utils.getField(target, fieldName);

		for (ObjetoAValidar validador : validadores) {
			if (validador.getTarget().equals(target)
					&& validador.getValue().equals(fieldName)) {
				if (!validador.getValidador().validar(value.toString()) ) {
					proceed(target, oldValue);
					throw new ValorInvalidoException("error, nombre vacio");

				} else {
					proceed(target, value);
										
				}
			}
		}

	}

	public void agregarValidador(Object target, String value,
			Validador<?> validador) {
		ObjetoAValidar contenedor = new ObjetoAValidar();
		contenedor.setTarget(target);
		contenedor.setValue(value);
		contenedor.setValidador(validador);

		validadores.add(contenedor);

	}

}